class Student(object):
    def setScore(self,value):
        if(value>100):
            value = 100
        if(value < 0):
            value = 0
        #__score属性我们通过setScore先设置，然后使用getScore获得，并对不合理值进行了处理。 
        self.__score = value
    

    def getScore(self):
        return self.__score




s = Student()
s.setScore(199)
print(s.getScore())


print("-----------------------------------------------------")
class Student2(object):


    @property
    def score(self):
        return self.__score
    
    @score.setter
    def score(self,value):
        if(value >100):
            value = 100
        if(value < 0 ):
            value = 0
        self.__score = value
s1 = Student2()
s1.score = 198
print(s1.score)

print("---------------------定制类-------------------------")
'''我们可以使用类型__slots__ 这种变量或者函数名来定制类
__slots__ 限制实例返回属性
__len__():自定义返回长度
__str__():当尝试使用print打印时,自定义返回类的内容，因为默认打印出一堆<__main__.Student object at 0x109afb190>，不好看。
__repr__(): 与__str__()类似,当直接敲变量 Student('yjc')不用print的时候，会自动调用该方法。
__getattr__():默认调用类里不存在的属性时，会报错。通过该方法，可以动态返回一个属性。
__call__(): 通过覆写该方法,可以将实例想方法那样直接调用
'''
class Student3(object):
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return 'Student object(name:%s)'%self.name
 
    def __getattr__(self,attr):
        if attr == 'score':
            return 90
    def __call__(self):
        print("我被调用了")
    

print(Student3('yjc'))
a = Student3('yjc')
print(a.score)
a()  #我被调用了 相当于初始化方法
